
#include <iostream>
#include <unistd.h>
#include <sys/epoll.h>
#include <cstdlib>
#include "Reactor.hpp"
#include "Sock.hpp"
#include "Accepter.hpp"
#include "Util.hpp"

#define SIZE 128
#define NUM 64

static void Usage(std::string proc)
{
  std::cerr << "Usage:" << proc << ":"
            << "port" << endl;
}

//Reactor反应堆模式:通过多路转接的方案,被动采取事件派发的方式,反向的调用对应的回调函数
//1.检测到事件epoll
//2.派发事件 Dispatcher(派发+IO) 半同步半异步处理
//3. 链接 Accepter
//4. IO  recver sender

// ./epoll_server port
int main(int argc, char *argv[])
{
  if (argc != 2)
  {
    Usage(argv[0]);
    exit(1);
  }

  // 1.创建socket
  int listen_sock = Sock::Socket();
  SetNonBlock(listen_sock);
  Sock::Bind(listen_sock, (uint16_t)atoi(argv[1]));
  Sock::Listen(listen_sock);

  // 2.创建Reactor对象
  Reactor *R = new Reactor();
  R->InitReactor();

  // 3.给Reactor反应堆中加柴火
  Event *evp=new Event;
  evp->sock=listen_sock;
  evp->R=R;
  //Accpeter链接管理器
  evp->RegisterCallBack(Accepter, nullptr, nullptr);
  //将柴火放入反应堆
  R->InsertEvent(evp,EPOLLIN|EPOLLET); //ET

  //4.进行事件派发
  int timeout=1000;
  for(;;)
  {
    R->Dispatcher(timeout);
  }
}